package lock

import (
	"fmt"
	"sync"
)

/*
锁 - 资源竞争
*/

var total int
var wg sync.WaitGroup

//能不用锁，就不用锁。会牺牲性能
//互斥锁,下面两个函数，必须要用同一把锁，两个谁抢到谁执行  -> 数据同步问题
var ml sync.Mutex

func add() {
	defer wg.Done()
	for i := 0; i < 10000; i++ {
		//total++
		ml.Lock()
		total = total + 1
		ml.Unlock()
		// 1. 从total中取出值
		// 2. 将total + 1
		// 3. 将值赋值给total
	}
}

func sub() {
	defer wg.Done()
	for i := 0; i < 10000; i++ {
		//total--
		ml.Lock()
		total = total - 1
		ml.Unlock()
	}
}

func LockLearnWithMutex() {
	//按理说，值应该是0
	//如果不加锁，结果不是0的
	wg.Add(2)
	go add()
	go sub()
	wg.Wait()

	fmt.Println("total: ", total)
}
